package cn.tedu.zblogs.home.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.HashMap;
import java.util.concurrent.TimeUnit;

/**
 * Redis的缓存工具类
 */

@Component
public class CacheUtil {


   // private final RedisTemplate<Object, Object> redisTemplate;
    //Serializable
    private final RedisTemplate<String, Serializable> redisTemplateSerializable;
    //int
    private final RedisTemplate<String, Integer> redisTemplateInteger;
    //Object
    private final RedisTemplate<String, Object> redisTemplateObject;

    @Autowired
    public CacheUtil(
                     RedisTemplate<String, Serializable> redisTemplateSerializable,
                     RedisTemplate<String, Integer> redisTemplateInteger,
                     RedisTemplate<String, Object> redisTemplateObject) {
        this.redisTemplateSerializable = redisTemplateSerializable;
        this.redisTemplateInteger = redisTemplateInteger;
        this.redisTemplateObject = redisTemplateObject;
    }



    public  void set(String key , Serializable value) {

        redisTemplateSerializable.opsForValue().set(key, value);

    }
    public  Serializable get(String key) {
        return redisTemplateSerializable.opsForValue().get(key);
        //return redisTemplate.opsForValue().get(key);

    }

    public  void delete(String key) {
        redisTemplateSerializable.delete(key);

    }
    //设置redis并添加缓存时间
    public  void  setExpire(String key , Serializable value, long timeout) {
        redisTemplateSerializable.opsForValue().set(key, value,timeout, TimeUnit.SECONDS);

    }
    //添加集合元素
    public  void addSet(String key , String value) {
        long timeout = 86400 * 2;  // 设置过期时间为两天，以秒为单位
        redisTemplateObject.opsForSet().add(key, value);
        // 设置key的过期时间，确保集合在两天后自动过期
        redisTemplateObject.expire(key, timeout, TimeUnit.SECONDS);

    }

    //获取集合元素个数
    public int Setsize(String key) {

        return Math.toIntExact(redisTemplateObject.opsForSet().size(key));
    }


    //添加自增
    public void increment(String key) {
        redisTemplateInteger.opsForValue().increment(key, 1);
    }
    //获取自增
    public Integer getCount(String key) {

       return redisTemplateInteger.opsForValue().get(key);
    }
}
